﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using NHibernate;
using NHibernate.Linq;

namespace Dao
{
    public class ProductDao : IProductDao
    {
        /// <summary>
        /// 针对单个数据库映射关系经过编译后的内存镜像，是线程安全的（不可变）。 它是生成ISession的工厂，本身要用到IConnectionProvider。 该对象可以在进程或集群的级别上，为那些事务之间可以重用的数据提供可选的二级缓存。 
        /// </summary>
        private ISessionFactory sessionFactory;

        /// <summary>
        /// 构造函数，读取NHibernateTest下的Hibernate数据库配置文件并生成ISession的工厂
        /// 不同类型的数据库的配置文件不同：提供程序、参数、默认值
        /// </summary>
        public ProductDao()
        {
            var cfg = new NHibernate.Cfg.Configuration().Configure("Config/hibernate.cfg.xml");
            sessionFactory = cfg.BuildSessionFactory();
        }

        public object Save(Domain.Product entity)
        {
            using (ISession session = sessionFactory.OpenSession())
            {
                var id = session.Save(entity);
                session.Flush();
                return id;
            }
        }

        public void Update(Domain.Product entity)
        {
            using (ISession session = sessionFactory.OpenSession())
            {
                session.Update(entity);
                session.Flush();
            }
        }

        public void Delete(Domain.Product entity)
        {
            using (ISession session = sessionFactory.OpenSession())
            {
                session.Delete(entity);
                session.Flush();
            }
        }

        public Domain.Product Get(object id)
        {
            using (ISession session = sessionFactory.OpenSession())
            {
                return session.Get<Domain.Product>(id);
            }
        }

        public Domain.Product Load(object id)
        {
            using (ISession session = sessionFactory.OpenSession())
            {
                return session.Load<Domain.Product>(id);
            }
        }

        public IList<Domain.Product> LoadAll()
        {
            using (ISession session = sessionFactory.OpenSession())
            {
                return session.Query<Domain.Product>().ToList();
            }
        }
    }
}
